package server;

import java.rmi.RemoteException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Date;

import client.*;

public class CijferlijstImpl implements Cijferlijst {
	private ObjectHandler oh;
	private HashMap<String, Double> cijfers;
	
	
	private static HashSet<MyObserver> observers = new HashSet<MyObserver>();
	
	@SuppressWarnings("unchecked")
	public CijferlijstImpl() {
		oh = new ObjectHandler("cijfers.obj");
		try {
			cijfers = (HashMap<String, Double>) oh.readObject();
		} catch (Exception e) {
			e.printStackTrace();
			cijfers = new HashMap<String, Double>();
		}
	}
	
	public void delete(String naam) throws RemoteException {
		System.out.println("CijferlijstImpl.delete("+naam+");");
		cijfers.remove(naam);
		notifyObservers();
	}
	
	public String getTableName() throws RemoteException {
		return "cijfers";
	}
	
	public void insert(String naam, String cijfer) throws RemoteException {
		System.out.println("CijferlijstImpl.insert("+naam+", "+cijfer+");");
		cijfers.put(naam, Double.parseDouble(cijfer.replace(",", ".")));
		notifyObservers();
	}
	
	public String[] select(String naam) throws RemoteException {
		System.out.println("cijferlijstImpl.select("+naam+");");
		String cijfer = cijfers.get(naam).toString();
		String[] rij = {naam, cijfer};
		return rij;
	}
	
	public ArrayList<String[]> selectAll() throws RemoteException {
		System.out.println("CijferlijstImpl.selectAll();");
		
		ArrayList<String[]> list = new ArrayList<String[]>();
		for (String key: cijfers.keySet()) {
			String[] rij = {key, cijfers.get(key).toString()};
			list.add(rij);
		}
		return list;
	}

	public void update(String naam, String nieuweNaam, String cijfer) throws RemoteException {
		System.out.println("CijferlijstImpl.update("+naam+", "+nieuweNaam+", "+cijfer+");");

		cijfers.remove(naam);
		cijfers.put(nieuweNaam, Double.parseDouble(cijfer));
		notifyObservers();
	}
	
	public void addMyObserver(MyObserver myObserver) throws RemoteException {
		System.out.println("cijferlijstImpl.addMyObserver();");
		observers.add(myObserver);
	}
	
	public void deleteMyObserver(MyObserver myObserver) throws RemoteException {
		System.out.println("cijferlijstImpl.deleteMyObserver();");
		observers.remove(myObserver);
	}
	
	private void notifyObservers() {
		System.out.println("Cijferlijst.notifyObservers();");
		for (Iterator<MyObserver> i = observers.iterator(); i.hasNext();) {
			MyObserver observer = i.next();
			try {
				observer.update(""+new Date());
			} catch(Exception e) {
				e.printStackTrace();
			}
		}
		saveObject();
	}
	
	public void saveObject() {
		System.out.println("CijferlijstImpl.saveObject();");
		try {
			oh.writeObject(cijfers);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void finalize() {
		System.out.println("CijferlijstImpl.finalize();");
		try {
			oh.writeObject(cijfers);
		} catch (Exception e) {
			e.printStackTrace();
		}
		try {
			super.finalize();
		} catch (Throwable e) {
			e.printStackTrace();
		}
	}
}